// 完整的线程安全的单例模式写法

class SinglePat {
    // volatile
    // 1. 确保每次读取数据都在内存读
    // 2. 在读取或者修改的时候，不会触发指令重排序

    static volatile private SinglePat singlePat = new SinglePat();
    static private final Object locker = new Object();

    private SinglePat() {}

    public SinglePat getSinglePat() {
        if (singlePat == null) {
            synchronized (locker) {
                if (singlePat == null) {
                    singlePat = new SinglePat();
                }
            }
        }

        return singlePat;
    }
}

public class Demo5 {

    public static void main(String[] args) {


    }
}
